package frsf.cidisi.exercise.tp1.interfaz;

import javax.swing.SwingUtilities;
import javax.swing.SwingWorker;

import com.sun.org.apache.bcel.internal.generic.GETSTATIC;

import frsf.cidisi.exercise.tp1.search.Arqueologo;
import frsf.cidisi.exercise.tp1.search.EstadoActualArqueologo;
import frsf.cidisi.exercise.tp1.search.EstadoActualIsla;
import frsf.cidisi.exercise.tp1.search.IslaEmiroce;
import frsf.cidisi.exercise.tp1.utiles.DatosAmbiente;
import frsf.cidisi.exercise.tp1.utiles.MetodosUtiles;
import frsf.cidisi.exercise.tp1.utiles.Parametros;
import frsf.cidisi.faia.simulator.SearchBasedAgentSimulator;
import frsf.cidisi.faia.simulator.Log;

public class ControlSimulacion {

	private Parametros parametros = new Parametros();
	private DatosAmbiente datosAmbiente = new DatosAmbiente();
	private MetodosUtiles metodosUtiles = new MetodosUtiles();
	private int escenario = 1;
	private IslaEmiroce environment;
	private Arqueologo agent;
	private Log log = new Log();
	private int esperaDePaso;
	private Principal interfaz;
	private SearchBasedAgentSimulator simulator;
	
	public void GenerarSimulacion(){
					
	   this.setAgent(new Arqueologo());
	   	   getAgent().setControlSimulacion(this);
	   	   getAgent().setParametros(parametros);
	       getAgent().setMetodosUtiles(metodosUtiles);
	       getAgent().setLog(getLog());
	       
	       getAgent().actualizarParametros();
	       getAgent().actualizarMetodosUtiles();
	       getAgent().actualizarFuncionObjetivo();
	       	
	    setEnvironment(new IslaEmiroce());
	    	getEnvironment().setControlSimulacion(this);
	    	getEnvironment().setLog(getLog());
	    	getEnvironment().setPirata(parametros.isPirata());
	    	getEnvironment().setDatosAmbiente(datosAmbiente);
	    	getEnvironment().actualizarDatosAmbiente(escenario);
	    	getEnvironment().getEnvironmentState().setPosicionAgente(((EstadoActualArqueologo)agent.getAgentState()).getPosicionAgente());
	    	
	    	getAgent().setDatosAmbiente(environment.getDatosAmbiente());
	    	getAgent().actualizarDatosAmbiente(escenario);
			
	}

	public void iniciarSimulacion(){
	
//		for(int i=0;i<11;i++){
//			getInterfaz().getTxtPosicion().setText(i+"");
//			getInterfaz().getPanelGeneral().validate();
//			try {
//				Thread.sleep(1000);
//			} catch (InterruptedException e) {
//				// TODO Auto-generated catch block
//				e.printStackTrace();
//			}
//		}
		
		simulator = new SearchBasedAgentSimulator(getEnvironment(), getAgent());
		simulator.setLog(log);
		simulator.setEsperaDePaso(getEsperaDePaso());

		//START
//		simulator.setUpSimulacion();
//		simulator.enviarPercepcion();
//		
//		do{
//			simulator.seleccionarAccion();
//			if(simulator.checkearAccion()){
//				simulator.ejecutarAccion();
//				actualizarEstadoEnInterfaz();
//				this.getInterfaz().repaint();
//				try {
//					Thread.sleep(1000);
//				} catch (InterruptedException e) {
//					// TODO Auto-generated catch block
//					e.printStackTrace();
//				}
//				
//			}
//			
//		} while (!simulator.agentSucceeded(simulator.getAction()) && !simulator.agentFailed(simulator.getAction()));
//	
//		simulator.evaluarObjetivo();
//		simulator.cerrarAmbiente();
//		simulator.simulationFinished();
		
//		new SwingWorker<Object, Object>(){
//
//			@Override
//			protected Object doInBackground() throws Exception {
				simulator.start();
				// TODO Auto-generated method stub
//				return null;
//			}
//		
//		}.execute();
//		
		
		
//		imprimirLog();
	}
	
	public void actualizarEstadoEnInterfaz(){
		double tesoro[]={0,0,0,0,0};

		interfaz.getTxtPosicion().setText(((EstadoActualArqueologo)getAgent().getAgentState()).getPosicionAgente()+"");
		interfaz.getTxtPosicion().repaint();
		for(int i=0; i<5; i++ ){
//			tesoro[i]=((EstadoActualArqueologo)getSimulator().getAgent().getAgentState()).getTesorosAcoplado()[i];
			tesoro[i]=((EstadoActualArqueologo)getAgent().getAgentState()).getTesorosAcoplado()[i];
		}
		interfaz.getTxtAcoplado().setText("["+tesoro[0]+" , "+tesoro[1]+" , "+tesoro[2]+" , "+tesoro[3]+" , "+tesoro[4]+"]");
		interfaz.getTxtObjetivo().setText(getParametros().getPosicionDeseada()+"");
		
		
		//actualizacion estado ambiente
		
		for(int i=0;i<5;i++){
			tesoro[i]=(getEnvironment().getEnvironmentState().getTesoros()[0][i]);
		}
		interfaz.getTxtAldea1().setText("["+tesoro[0]+" , "+tesoro[1]+" , "+tesoro[2]+" , "+tesoro[3]+" , "+tesoro[4]+"]");
		
		for(int i=0;i<5;i++){
			tesoro[i]=(getEnvironment().getEnvironmentState().getTesoros()[1][i]);
		}
		interfaz.getTxtAldea2().setText("["+tesoro[0]+" , "+tesoro[1]+" , "+tesoro[2]+" , "+tesoro[3]+" , "+tesoro[4]+"]");
		
		for(int i=0;i<5;i++){
			tesoro[i]=(getEnvironment().getEnvironmentState().getTesoros()[2][i]);
		}
		interfaz.getTxtAldea3().setText("["+tesoro[0]+" , "+tesoro[1]+" , "+tesoro[2]+" , "+tesoro[3]+" , "+tesoro[4]+"]");
		
		for(int i=0;i<5;i++){
			tesoro[i]=(getEnvironment().getEnvironmentState().getTesoros()[3][i]);
		}
		interfaz.getTxtAldea4().setText("["+tesoro[0]+" , "+tesoro[1]+" , "+tesoro[2]+" , "+tesoro[3]+" , "+tesoro[4]+"]");
		
		for(int i=0;i<5;i++){
			tesoro[i]=(getEnvironment().getEnvironmentState().getTesoros()[4][i]);
		}
		interfaz.getTxtAldea5().setText("["+tesoro[0]+" , "+tesoro[1]+" , "+tesoro[2]+" , "+tesoro[3]+" , "+tesoro[4]+"]");
		
		for(int i=0;i<5;i++){
			tesoro[i]=(getEnvironment().getEnvironmentState().getTesoros()[5][i]);
		}
		interfaz.getTxtAldea6().setText("["+tesoro[0]+" , "+tesoro[1]+" , "+tesoro[2]+" , "+tesoro[3]+" , "+tesoro[4]+"]");
	
		for(int i=0;i<5;i++){
			tesoro[i]=(getEnvironment().getEnvironmentState().getTesoros()[6][i]);
		}
		interfaz.getTxtAldea7().setText("["+tesoro[0]+" , "+tesoro[1]+" , "+tesoro[2]+" , "+tesoro[3]+" , "+tesoro[4]+"]");
		
		for(int i=0;i<5;i++){
			tesoro[i]=(getEnvironment().getEnvironmentState().getTesoros()[7][i]);
		}
		interfaz.getTxtAldea8().setText("["+tesoro[0]+" , "+tesoro[1]+" , "+tesoro[2]+" , "+tesoro[3]+" , "+tesoro[4]+"]");
		
		for(int i=0;i<5;i++){
			tesoro[i]=(getEnvironment().getEnvironmentState().getTesoros()[8][i]);
		}
		interfaz.getTxtAldea9().setText("["+tesoro[0]+" , "+tesoro[1]+" , "+tesoro[2]+" , "+tesoro[3]+" , "+tesoro[4]+"]");
		
		for(int i=0;i<5;i++){
			tesoro[i]=(getEnvironment().getEnvironmentState().getTesoros()[9][i]);
		}
		interfaz.getTxtAldea10().setText("["+tesoro[0]+" , "+tesoro[1]+" , "+tesoro[2]+" , "+tesoro[3]+" , "+tesoro[4]+"]");
		

		for(int i=0;i<5;i++){
			tesoro[i]=(getEnvironment().getEnvironmentState().getTesoros()[10][i]);
		}
		interfaz.getTxtAldea11().setText("["+tesoro[0]+" , "+tesoro[1]+" , "+tesoro[2]+" , "+tesoro[3]+" , "+tesoro[4]+"]");
		
		//actualizacion estado ubeme
		interfaz.getTxtPosicionUbeme().setText(getEnvironment().getEnvironmentState().getPosicionPirata()+"");
		interfaz.getTxtPosicionUbeme().validate();
	
		for(int i=0;i<5;i++){
			tesoro[i]=(((EstadoActualIsla)getSimulator().getEnvironment().getEnvironmentState()).getTesoroPirata()[i]);
		}
		interfaz.getTxtTesorosRobados().setText("["+tesoro[0]+" , "+tesoro[1]+" , "+tesoro[2]+" , "+tesoro[3]+" , "+tesoro[4]+"]");
	}
	
	
	public void imprimirLog(){
		
		while(!getLog().getLogVolatil().isEmpty()){
			
			System.out.println(getLog().getLogVolatil().getFirst());
			getLog().getLogVolatil().removeFirst();
		}
	}

	public void setEscenario(int escenario) {
		this.escenario = escenario;
	}


	public int getEscenario() {
		return escenario;
	}


	public Parametros getParametros() {
		return parametros;
	}


	public void setParametros(Parametros parametros) {
		this.parametros = parametros;
	}


	public DatosAmbiente getDatosAmbiente() {
		return datosAmbiente;
	}


	public void setDatosAmbiente(DatosAmbiente datosAmbiente) {
		this.datosAmbiente = datosAmbiente;
	}


	public MetodosUtiles getMetodosUtiles() {
		return metodosUtiles;
	}


	public void setMetodosUtiles(MetodosUtiles metodosUtiles) {
		this.metodosUtiles = metodosUtiles;
	}

	public void setEnvironment(IslaEmiroce environment) {
		this.environment = environment;
	}

	public IslaEmiroce getEnvironment() {
		return environment;
	}

	public void setAgent(Arqueologo agent) {
		this.agent = agent;
	}

	public Arqueologo getAgent() {
		return agent;
	}

	public Log getLog() {
		return log;
	}

	public void setLog(Log log) {
		this.log = log;
	}

	public void setEsperaDePaso(int esperaDePaso) {
		this.esperaDePaso = esperaDePaso;
	}

	public int getEsperaDePaso() {
		return esperaDePaso;
	}

	public void setInterfaz(Principal interfaz) {
		this.interfaz = interfaz;
	}

	public Principal getInterfaz() {
		return interfaz;
	}

	public void actualizarConsolaEnInterfaz() {
		
		String agregarAConsola = "";
		String agregar = getSimulator().getLog().getMensaje();
		
		while(!agregar.equals("No hay mas mensajes")){
			

			agregarAConsola = agregarAConsola +"\n" + agregar;
			agregar = getSimulator().getLog().getMensaje();	
			 	
		}
		 
		
		getInterfaz().getConsola().setText(getInterfaz().getConsola().getText()+agregarAConsola);
		
		
	}

	public SearchBasedAgentSimulator getSimulator() {
		return simulator;
	}

	public void setSimulator(SearchBasedAgentSimulator simulator) {
		this.simulator = simulator;
	}
	
	
}
